﻿using System;

namespace Xpus.Web.Common
{
	/// <summary>
	/// 表示当前访问的xpus版本（local、alpha、beta、release等）。
	/// </summary>
	public enum XpusRelease
	{
		/// <summary>
		/// 发布版，对应[app].xpus.net。
		/// </summary>
		Release = 0,

		/// <summary>
		/// 本地测试版，对应[app].local.xpus.net。
		/// </summary>
		LocalXpus = 1,
	}

	/// <summary>
	/// 为XpusRelease枚举提供辅助功能。
	/// </summary>
	public static class XpusReleaseUtility
	{
		/// <summary>
		/// 正式版的二级域名。
		/// </summary>
		public const string ReleaseDomain = "";

		/// <summary>
		/// 本地版本的二级域名。
		/// </summary>
		public const string LocalXpusDomain = "local";

		/// <summary>
		/// 获取版本的二级域名。
		/// </summary>
		/// <param name="release">版本。</param>
		/// <returns>对应版本的二级域名。</returns>
		public static string GetDomain(this XpusRelease release)
		{
			switch (release)
			{
				case XpusRelease.Release: return ReleaseDomain;
				case XpusRelease.LocalXpus: return LocalXpusDomain;
				default: return ReleaseDomain;
			}
		}

		/// <summary>
		/// 根据二级域名获取版本。
		/// </summary>
		/// <param name="domain">二级域名。</param>
		/// <returns>对应的xpus版本。</returns>
		public static XpusRelease GetByDomain(string domain)
		{
			if (string.IsNullOrEmpty(domain))
				return XpusRelease.Release;

			if (string.Compare(domain, LocalXpusDomain, true) == 0)
				return XpusRelease.LocalXpus;

			throw new XpusInvalidReleaseException(domain);
		}
	}

	/// <summary>
	/// 表示所访问的版本不是有效的发布版本。
	/// </summary>
	public class XpusInvalidReleaseException : Exception
	{
		/// <summary>
		/// 用户所访问的版本的二级域名。
		/// </summary>
		public string ReleaseName { get; private set; }

		/// <summary>
		/// 初始化异常对象。
		/// </summary>
		/// <param name="release">用户所访问的发布版本。</param>
		public XpusInvalidReleaseException(string release)
			: base(string.Format("所访问的版本({0})不是有效的发布版本。", release))
		{
			ReleaseName = release;
		}
	}
}
